package com.improvess.rna.som;


public abstract class RedeSOM {

	private Neuronio[][] neuronios;
	private int quantidadeDeNeuronios;
	private int quantidadeDeAtributos;
	private double sigmaVizinhanca;
	
	public RedeSOM(int quantidadeDeNeuronios, int quantidadeDeAtributos, double sigmaVizinhanca){

		this.quantidadeDeNeuronios = quantidadeDeNeuronios;
		this.quantidadeDeAtributos = quantidadeDeAtributos;
		this.sigmaVizinhanca = sigmaVizinhanca;
		int raizQuantidadeDeNeuronios = (int) (Math
				.sqrt(this.quantidadeDeNeuronios));

		this.neuronios = new Neuronio[raizQuantidadeDeNeuronios][raizQuantidadeDeNeuronios];
		
	}

	public void inicializarNeuronios() {
		int raizQuantidadeDeNeuronios = (int) (Math
				.sqrt(this.quantidadeDeNeuronios));
		for (int i = 0; i < raizQuantidadeDeNeuronios; i++) {
			for (int k = 0; k < raizQuantidadeDeNeuronios; k++) {
				this.neuronios[i][k] = inicializarNeuronio(i, k);
			}
		}
	}

	protected abstract Neuronio inicializarNeuronio(int i, int k);

	public Neuronio[][] getNeuronios() {
		return neuronios;
	}
	
	public void setNeuronios(Neuronio[][] neuronios) {
		this.neuronios = neuronios;
	}
	
	public int getQuantidadeDeAtributos() {
		return quantidadeDeAtributos;
	}
	
	public int getQuantidadeDeNeuronios() {
		return quantidadeDeNeuronios;
	}
	
	public double getSigmaVizinhanca() {
		return sigmaVizinhanca;
	}

	public void setSigmaVizinhanca(double sigmaVizinhanca) {
		this.sigmaVizinhanca = sigmaVizinhanca;
	}
	
	public abstract int aprendizagem(double[][] treinamento);

	public abstract Neuronio vencedor(int i);

}
